#这里定义了购物车的类（CartItem），属性为商品id（product_id），商品名（product_name），价格（price），数量（quantity）默认为1.
# ali_bao_bao/models/cart.py
class CartItem:
    """购物车项，对应单个商品及数量"""
    def __init__(self, product_id, product_name, price, quantity=1, selected=False):
        self.product_id = product_id  # 商品ID（用于序列化）
        self.product_name = product_name  # 商品名称（冗余存储，方便显示）
        self.price = price  # 加入购物车时的价格（固定，不受后续价格变动影响）
        self.quantity = quantity  # 数量
        self.selected = selected  # 是否选中（用于结算），默认未选中

    def get_total(self):
        """计算当前项的总价"""
        return self.price * self.quantity

    def to_dict(self):
        """转换为字典，用于JSON存储"""
        return {
            "product_id": self.product_id,
            "product_name": self.product_name,
            "price": self.price,
            "quantity": self.quantity,
            "selected": self.selected
        }

    @classmethod
    def from_dict(cls, data):
        """从字典恢复为CartItem对象"""
        return cls(
            product_id=data["product_id"],
            product_name=data["product_name"],
            price=data["price"],
            quantity=data["quantity"],
            selected=data.get("selected", False)  # 默认未选中
        )


class Cart:
    """购物车类，管理多个购物车项"""
    def __init__(self):
        self.items = []  # 存储CartItem对象

    def add_item(self, product_id, product_name, price, quantity=1):
        """添加商品到购物车（已存在则更新数量）"""
        # 检查商品是否已在购物车中
        for item in self.items:
            if item.product_id == product_id:
                item.quantity += quantity
                return True
        # 新增购物车项
        new_item = CartItem(
            product_id=product_id,
            product_name=product_name,
            price=price,
            quantity=quantity
        )
        self.items.append(new_item)
        return True

    def remove_item(self, product_id):
        """从购物车移除商品"""
        self.items = [item for item in self.items if item.product_id != product_id]

    def update_quantity(self, product_id, quantity):
        """更新商品数量（数量<=0则移除）"""
        if quantity <= 0:
            self.remove_item(product_id)
            return
        for item in self.items:
            if item.product_id == product_id:
                item.quantity = quantity
                break

    def calculate_total(self, selected_only=False):
        """
        计算购物车商品的总价
        
        参数:
            selected_only: 是否只计算选中的商品
            
        返回:
            float: 总价
        """
        if selected_only:
            return sum(item.get_total() for item in self.items if item.selected)
        return sum(item.get_total() for item in self.items)
    
    def get_selected_items(self):
        """获取所有选中的商品"""
        return [item for item in self.items if item.selected]
    
    def select_all(self):
        """全选所有商品"""
        for item in self.items:
            item.selected = True
    
    def deselect_all(self):
        """取消全选"""
        for item in self.items:
            item.selected = False
    
    def toggle_selection(self, product_id):
        """切换商品的选中状态"""
        for item in self.items:
            if item.product_id == product_id:
                item.selected = not item.selected
                return True
        return False

    def to_dict(self):
        """转换为字典，用于JSON存储"""
        return [item.to_dict() for item in self.items]

    @classmethod
    def from_dict(cls, data_list):
        """从字典列表恢复为Cart对象"""
        cart = cls()
        for item_data in data_list:
            cart.items.append(CartItem.from_dict(item_data))
        return cart